//
// Created by jerry on 2021/4/6.
//

#ifndef C_QUEUE_DEMO_QUEUE_H
#define C_QUEUE_DEMO_QUEUE_H

#include <stddef.h>
#include <pthread.h>
#include <stdbool.h>

#include "queue.h"

/**
 * 用户信息
 * */
struct USER_INFO
{
    int id;
    char *name;
    int age;
    int sex;
};

/**
 *  链表节点(单向)
 *  在队列中以此结构存储
 * */
struct NODES
{
    struct USER_INFO *userInfo;
    struct NODES     *next;
};

/**
 *  队列句柄
 * */
struct QUEUE
{
    size_t qCount;           // 队列长度
    pthread_mutex_t *qMutex; // Mutex锁

    /* 函数指针，初始化后可通过QUEUE->xxx 方式调用 */
    void   (* ENQUEUE)     (struct QUEUE *, struct USER_INFO *); // 入列
    struct USER_INFO * (* DEQUEUE) (struct QUEUE *);             // 出列
    size_t (* QUEUE_COUNT) (struct QUEUE *);                     // 队列长度
    size_t (* QUEUE_COUNT_DEBUG) (struct QUEUE *);               // 队列长度
    void   (* QUEUE_FREE)  (struct QUEUE **, bool);              // 释放队列

    struct NODES *head; // 链表头部
};

/* 队列初始化 */
struct QUEUE *queue_init();
/* 入列 */
void enqueue(struct QUEUE *queue, struct USER_INFO *userInfo);
/* 出列 */
struct USER_INFO *dequeue(struct QUEUE *queue);
/* 查询队列长度 */
size_t queue_count(struct QUEUE *queue);
/* 查询队列长度 */
size_t queue_count_debug(struct QUEUE *queue);
/* 释放队列 */
void queue_free(struct QUEUE **queue, bool freeData);

#endif //C_QUEUE_DEMO_QUEUE_H
